#include <iostream>
#include <fstream>
#include "ahoCorasick.h"

using namespace std;

int main()
{
    ifstream badWordsStream, inputStream;
    ofstream outputStream;
    badWordsStream.open("/Users/lacoste/Documents/Projects/ahoCorasik/ahoCorasik/stopwords.txt", ios::in);
    inputStream.open("/Users/lacoste/Documents/Projects/ahoCorasik/ahoCorasik/input.txt", ios::in);
    outputStream.open("/Users/lacoste/Documents/Projects/ahoCorasik/ahoCorasik/output.txt", ios::out);
    
    AhoCorasick tree;
    string badWord;
    while (getline(badWordsStream, badWord)) { //считываем все плохие слова из badWordsStream
        tree.addPattern(badWord); //добавляем их в pattern
    }
    badWordsStream.close();
    string str;
    int badWordsFound = 0;
    int currentTextLength = 0;
    
    while (getline(inputStream, str)) { //считываем построчно строки из inputStream
        vector<AhoCorasick::Match> matches;
        tree.getMatches(str, matches); //получаем в matches все совпадения
        for (auto i = matches.begin(); i != matches.end(); i++) { //проходим по matches
            for (int j = i->textPosition; j < i->textPosition + tree.getPattern(i->patternIndex).size(); j++) { //заменяем плохие слова на '*'
                str[j] = '*';
            }
            if (badWordsFound < 10) { //если кол-во найденных плохих слов меньше 10 то выводим координаты найденного плохого слова
                badWordsFound++;
                cout << currentTextLength + i->textPosition << "\n";
            }
        }
        outputStream << str << "\n";
        currentTextLength += str.size(); //увеличиваем текущую длину текста на длину текущей строки
    }
    return 0;
}
